package com.ll.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component //交给spring管理
@Aspect //表示当前类是一个切面类
public class MyAdvice {
    //定义切点, 表示在UserMapper接口中的getList方法上进行切面
    //@Pointcut：定义切点
    //execution(返回值类型 包名.类名.方法名(参数列表))
//    @Pointcut("execution(java.util.List com.ll.mapper.UserMapper.getList(String) )")
    @Pointcut("execution(* com.ll.mapper.*.*(..))")
    public void pt(){}
    //制作切面
    //前置通知
    @Before("pt()")
    public void before() {
        System.out.println("前置通知");
        //获取调用时间
        System.out.println("调用时间:"+System.currentTimeMillis());
    }
    //后置通知
    @After("pt()")
    public void after() {
        System.out.println("后置通知");
        System.out.println("调用时间:"+System.currentTimeMillis());
    }
    //环绕通知
    @Around("pt()")
    public void around(ProceedingJoinPoint pjp){
        System.out.println("环绕通知");
        //获取调用方法的类名
        System.out.println("类名："+pjp.getTarget().getClass().getName());
        //获取方法名
        System.out.println("方法名："+pjp.getSignature().getName());
        //获取参数
        Object[] args = pjp.getArgs();
        for (Object arg : args) {
            System.out.println("参数："+arg);
        }
        System.out.println("调用时间:"+System.currentTimeMillis());
        //调用方法
        try {
            pjp.proceed();
        }catch (Throwable e){
            throw new RuntimeException(e);
        }
        System.out.println("结束时间:"+System.currentTimeMillis());
    }
    //异常通知
    //异常发生可以做：
    //1。记录异常的时间，位置，等信息
    //2。发送邮件，短信，通知开发人员
    @AfterThrowing(value = "pt()",throwing = "e")
    public void afterThrowing(JoinPoint point, Exception e) {
        System.out.println("异常通知");
        System.out.println("调用类名："+point.getSignature().getDeclaringType().getName());
        System.out.println("方法名："+point.getSignature().getName());
        //获取异常信息
        System.out.println("异常信息："+e.getMessage());
        //将异常发送到钉钉群
    }
}
